package tulingxueyuan117;

import com.sun.org.apache.bcel.internal.generic.ARETURN;

/**
 * Author: Zhang Dongwei
 * Date: 2022/11/6 13:21
 * 给定一个二叉树，判断它是否是高度平衡的二叉树。
 *
 * 本题中，一棵高度平衡二叉树定义为：
 *
 * 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
 */
public class p30_平衡二叉树_110 {
    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(3);
        TreeNode node2 = new TreeNode(9);
        TreeNode node3 = new TreeNode(20);
        TreeNode node4 = new TreeNode(15);
        TreeNode node5 = new TreeNode(7);
        node1.left = node2;
        node1.right = node3;
        node3.left = node4;
        node3.right = node5;
        boolean res = isBalanced(node1);
        System.out.println(res);
    }

//    自己写的
//    public static boolean isBalanced(TreeNode root) {
//        if(root==null) return true;
//        int ld = maxDepth(root.left);
//        int rd = maxDepth(root.right);
//        if(Math.abs(ld-rd)>1) return false;
//        return isBalanced(root.left)&&isBalanced(root.right);
//    }
//
//    public static int maxDepth(TreeNode root) {
//        if(root==null) return 0;
//        return Math.max(maxDepth(root.left), maxDepth(root.right))+1;
//    }

//    视频讲解，也是递归(效率比上面的好一些)
    public static boolean isBalanced(TreeNode root) {
        if(root==null) return true;
        return helper(root) != -1;
    }
//    定义递归方法
    public static int helper(TreeNode root){
        if(root == null) return 0;
        int left = helper(root.left);
        int right = helper(root.right);
        if(left == -1 || right == -1 || Math.abs(left-right)>1) return -1;
        return Math.max(left, right)+1;
    }
}
